#!/usr/local/bin/php

<?php

define('INSTALL_DIR', dirname(__DIR__));

require INSTALL_DIR . '/vendor/autoload.php';

use App\Util\Common;
use App\Util\HTML as H;
use Functional as F;

$template = '
graph database {

%tables%

%edges%

}
';

$files = glob(INSTALL_DIR . '/src/Entity/*.php');

$tables = [];
$edges  = [];
foreach ($files as $file) {
    require_once $file;

    $declared = get_declared_classes();
    $class    = end($declared);
    $schema   = $class::schemaDef();
    $table    = $schema['name'];
    $fields   = [['name' => $table, 'type' => '']];
    foreach ($schema['fields'] as $name => $opts) {
        $fields[] = [
            'name' => $name,
            'type' => ": {$opts['type']}" . ($opts['type'] == 'varchar' ? "({$opts['length']})" : ''),
        ];
    }

    if (isset($schema['foreign keys'])) {
        foreach ($schema['foreign keys'] as $name => $map) {
            // Patern matching like above would be nice
            list($foreign_table,
                 $keys)  = $map;
            $local_key   = array_keys($keys)[0];
            $foreign_key = $keys[$local_key];
            $edges[]     = "{$table}:{$local_key} -- {$foreign_table}:{$foreign_key}";
        }
    }

    $cell = function ($field) {
        $def = $field['name'] . $field['type'];
        return ['tr' => ['td' => ['attrs' => ['port' => $field['name']], $def]]];
    };
    $html = ['table' => array_merge(
              ['attrs' => ['border' => '0', 'cellborder' => '1', 'cellspacing' => '0']],
              F\map($fields, $cell)),
    ];

    $tables[] = Common::indent("{$table} [shape=none, label=<\n" . Common::indent(H::html($html)) . "\n>]");
}

$replace = [
    '/%tables%/' => Common::indent(implode("\n", $tables)),
    '/%edges%/'  => Common::indent(implode("\n", $edges)),
    // '/_/'        => '\textunderscore ',
];

$out = $template;
foreach ($replace as $from => $to) {
    $out = preg_replace($from, $to, $out);
}

$path = dirname(__DIR__) . '/DOCUMENTATION/database';

$outfile = $path . '/database.dot';
file_put_contents($outfile, $out);

system("neato -Goverlap=false -Gsplines=true -Tpdf {$path}/database.dot -o {$path}/database.pdf");

echo "Generated database diagram. See {$path}/database.pdf\n";
